/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package entities;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.validation.constraints.NotNull;

/**
 *
 * @author Yeezus
 */
@Entity
@Table(name = "FARMACIA", uniqueConstraints = @UniqueConstraint(columnNames = "NOME"))
@NamedQueries({
    @NamedQuery(name = "findAllFarmacias",
    query = "SELECT f FROM Farmacia f " + " WHERE f.admin.username = :nome ORDER BY f.nome"
    )})
public class Farmacia implements Serializable {

    @Id
    @NotNull
    private String nome;

    @OneToMany(mappedBy = "farmacia", cascade = CascadeType.REMOVE)
    @NotNull
    private List<ProdutoCatalogo> catalogo; //registado cada poduto que deve de existir na farmácia e para cada um, registado o 
    //número de unidades existentes de cada tipo e o limite critico de cada tipo (ex: benuron, existem 300, limite critico:200)

    @OneToMany(mappedBy = "farmacia", cascade = CascadeType.REMOVE)
    @NotNull
    private List<ProdutoFisico> produtosFisicos; //todos os produtos reais(físicos) que pertencem à farmácia. registado cada benuron.. (benuron ref 123123, benuron ref 432423...) 

    @OneToMany(mappedBy = "farmacia", cascade = CascadeType.REMOVE)
    List<FuncBalcao> funcsBalcao;

    @OneToMany(mappedBy = "farmacia", cascade = CascadeType.REMOVE)
    List<FuncArmazem> funcsArmazem;

    @OneToMany(mappedBy = "farmacia", cascade = CascadeType.REMOVE)
    List<Encomenda> encomendas;

    @ManyToOne
    @NotNull
    @JoinColumn(name = "ADMIN_ID")
    private Administrador admin;

    public Farmacia(String nome, Administrador admin) {
        this.nome = nome;
        this.catalogo = new LinkedList<>();
        this.admin = admin;
        funcsBalcao = new LinkedList<>();
        produtosFisicos = new LinkedList<>();
        funcsArmazem = new LinkedList<>();
        encomendas = new LinkedList<>();
    }

    public Farmacia() {
        funcsBalcao = new LinkedList<>();
        produtosFisicos = new LinkedList<>();
        funcsArmazem = new LinkedList<>();
        encomendas = new LinkedList<>();
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public List<ProdutoCatalogo> getCatalogo() {
        return catalogo;
    }

    public void setCatalogo(List<ProdutoCatalogo> catalogo) {
        this.catalogo = catalogo;
    }

    public List<ProdutoFisico> getProdutosFisicos() {
        return produtosFisicos;
    }

    public void setProdutosFisicos(List<ProdutoFisico> produtosFisicos) {
        this.produtosFisicos = produtosFisicos;
    }

    public List<FuncArmazem> getFuncsArmazem() {
        return funcsArmazem;
    }

    public void setFuncsArmazem(List<FuncArmazem> funcsArmazem) {
        this.funcsArmazem = funcsArmazem;
    }

    public Administrador getAdmin() {
        return admin;
    }

    public void setAdmin(Administrador admin) {
        this.admin = admin;
    }

    public List<FuncBalcao> getFuncsBalcao() {
        return funcsBalcao;
    }

    public void setFuncsBalcao(List<FuncBalcao> funcsBalcao) {
        this.funcsBalcao = funcsBalcao;
    }

    public List<Encomenda> getEncomendas() {
        return encomendas;
    }

    public void setEncomendas(List<Encomenda> Encomendas) {
        this.encomendas = Encomendas;
    }

}
